特定IAMロールへスイッチロールしたことを通知する
「クリティカルな用途で使われるIAMロール」へスイッチロールしたことを通知して、 管理者が気付ける仕組みを作ってみます。
以降でアーキテクチャを記載します。 実際に通知リソースを作成して、通知されることまで確認します。
アーキテクチャ概要
スイッチロールを検出する EventBridgeルールを作成します。 バージニア北部(us-east-1)上で作成することに注意してください。
EventBridgeルールのターゲットとしてSNSトピックを選択します。 SNSトピックから各種通知先(メールなど)へメッセージを送信します。 メッセージ内容は EventBridgeの入力トランスフォーマーである程度整形します。
作ってみる
スイッチロール元のAWSアカウントにてリソースを作成していきます。 以降は 全てバージニア北部(us-east-1)リージョンでの作業 です。
事前準備: SNSトピックを作成、設定する
SNSトピックを作成して、 適切な通知先へのサブスクリプションを設定します。
今回は、以下のようなSNSトピック detect-switchrole
と、 Eメール サブスクリプションを作成しています。
EventBridge ルールを作成する
以下のようなパラメータの EventBridgeルールを作成します。
パラメータ | 値 |
---|---|
名前 | 任意 ( detect-switchrole など) |
イベントパターン | (後述のJSON) |
ターゲット | 先程作成したSNSトピック |
入力トランスフォーマー | (後述の入力パス/テンプレート) |
↓ イベントパターンJSON (SwitchTo部分を適宜変更ください)
{
"source": ["aws.signin"],
"detail-type": ["AWS Console Sign In via CloudTrail"],
"detail": {
"eventSource": ["signin.amazonaws.com"],
"eventName": ["SwitchRole"],
"additionalEventData": {
"$or": [
{"SwitchTo": [{ "suffix": "SomeImportantRole_Admin"}]},
{"SwitchTo": [{ "suffix": "SomeImportantRole_Read" }]}
]
}
}
}
↓ 入力トランスフォーマー > 入力パス
{
"AccountID": "$.detail.userIdentity.accountId",
"EventTime": "$.detail.eventTime",
"UserArn": "$.detail.userIdentity.arn",
"SwitchTo": "$.detail.additionalEventData.SwitchTo",
"SwitchRoleResponse": "$.detail.responseElements.SwitchRole"
}
↓ 入力トランスフォーマー > テンプレート
"アカウント <AccountID> からのスイッチロールを検知しました。"
"・時刻: <EventTime>"
"・ユーザーARN: <UserArn>"
"・スイッチ先: <SwitchTo>"
"・スイッチロールステータス: <SwitchRoleResponse>"
通知を確認する
実際に通知されるところまで確認します。
↓特定のIAMロールへスイッチロール
[ロールの切り替え] を行います。
↓メール通知を確認
スイッチロール後、すぐに以下のようなメールを受け取りました。
"アカウント 123456789012 からのスイッチロールを検知しました。"
"・時刻: 2023-09-04T02:15:18Z"
"・ユーザーARN: arn:aws:sts::123456789012:assumed-role/AWSReservedSSO_AdministratorAccess_31example/kawahara@example.com"
"・スイッチ先: arn:aws:iam::111111111111:role/SomeImportantRole_Admin"
"・スイッチロールステータス: Success"
おわりに
以上、IAMスイッチロールを通知する仕組みを作ってみました。
なお、本ブログ作成は 以下サーバーワークスさんのブログに助けられました。(感謝!)
「EventBridgeルールのフィルタには AWS Console Sign In via CloudTrail
を使う必要がある」部分でハマりました。 上記ブログのおかげで早く解決できました。
参考
- AWS Management Console sign-in events - AWS CloudTrail
- Amazon EventBridge イベントパターンでのコンテンツのフィルタリング - Amazon EventBridge
- EventBridge を利用して IAM User の SwitchRole 通知を行う - サーバーワークスエンジニアブログ
補足
スイッチロールイベントのJSONサンプル
{
"version": "0",
"id": "e37f7eb0-231e-2274-2722-f6example",
"detail-type": "AWS Console Sign In via CloudTrail",
"source": "aws.signin",
"account": "123456789012",
"time": "2023-09-04T01:58:50Z",
"region": "us-east-1",
"resources": [],
"detail": {
"eventVersion": "1.08",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AROAEXAMPLE:kawahara@example.com",
"arn": "arn:aws:sts::123456789012:assumed-role/AWSReservedSSO_AdministratorAccess_31ae5bfa4c67e7f8/kawahara@example.com",
"accountId": "123456789012"
},
"eventTime": "2023-09-04T01:58:50Z",
"eventSource": "signin.amazonaws.com",
"eventName": "SwitchRole",
"awsRegion": "global",
"sourceIPAddress": "104.28.XX.XX",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
"requestParameters": null,
"responseElements": {
"SwitchRole": "Success"
},
"additionalEventData": {
"RedirectTo": "https://us-east-1.console.aws.amazon.com/events/home?region=us-east-1#/",
"SwitchTo": "arn:aws:iam::111111111111:role/SomeImportantRole_Admin"
},
"eventID": "bf0b3284-c431-4840-9a0c-42example",
"readOnly": false,
"eventType": "AwsConsoleSignIn",
"managementEvent": true,
"recipientAccountId": "123456789012",
"eventCategory": "Management",
"tlsDetails": {
"tlsVersion": "TLSv1.3",
"cipherSuite": "TLS_AES_128_GCM_SHA256",
"clientProvidedHostHeader": "signin.aws.amazon.com"
}
}
}